#ifndef __EVENT_SUPPLIER_H_
#define __EVENT_SUPPLIER_H_

#include <IceStorm/IceStorm.h>
#include "collaboration.h"
#include "event.h"

/**
* PUBLISHER
* Clase wrapper para un emisor de eventos. Para hacer uso
* de esta clase hay que heredar de ella e implementar el metodo
* "disconnect_push_supplier". Las clases que heredan de esta tienen que
* llamar a su constructor.
*
* @author Carlos Rodriguez Dominguez
*/
class EventSupplier : virtual public Collaboration::EventSupplier {
public:
	
	/**
	* Constructor
	*
	* @param c Comunicador para el consumidor de eventos
	* @param host Nombre del host
	*/
	EventSupplier(::Ice::CommunicatorPtr& c, const std::string& host);
	
	/**
	* Destructor
	*/
	virtual ~EventSupplier();
	
	/**
	* Emite un evento.
	*
	* @param data Evento a emitir
	*/
	virtual void push(const ::Collaboration::Event& evt,
                      const Ice::Current& c);

	/**
	* Permite suscribirse a un emisor de eventos.
	*
	* @param ec Proxy hacia el consumidor de eventos que se suscribe.
	*/
	virtual void subscribe(const ::Collaboration::EventConsumerPrx& ec,
                           const Ice::Current& c);

	/**
	* Permite eliminar una suscripcion de un consumidor hacia 
	* un emisor de eventos.
	*
	* @param ec Proxy hacia el consumidor de eventos.
	*/
    virtual void unsubscribe(const ::Collaboration::EventConsumerPrx& ec,
                             const Ice::Current& c);
	
protected:
	::Ice::CommunicatorPtr comm; /**< Acceso al comunicador de ICE */
	IceStorm::TopicPrx topic; /**< Proxy hacia el topico de la suscripcion */
	Collaboration::EventSupplierPrx supplier; /**< Proxy hacia el emisor de eventos */
	
	
	/**
	* Crea el emisor de eventos
	*/
	void createSupplier(const std::string& host);
};

#endif
